package util;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import negocio.ListaDeRodamientos;
import negocio.Rodamiento;
import negocio.items.ItemCotizacion;
import negocio.items.ItemSolicitudCotizacion;

public class RodamientoUtil {
	
	private static RodamientoUtil instancia;
	private List<Rodamiento> rodamientosValidos;
	private List<ListaDeRodamientos> listasDeRodamientos;
	
	private RodamientoUtil(){
		rodamientosValidos = new ArrayList<Rodamiento>();
		listasDeRodamientos = new ArrayList<ListaDeRodamientos>();
		this.cargarRodamientosValidos();
	}

	public static RodamientoUtil obtenerInstancia(){
		if(instancia==null)
			instancia=new RodamientoUtil();
		return instancia;
	}
	
	public ItemCotizacion validarRodamiento(ItemSolicitudCotizacion item){
		List<ItemCotizacion> itemsCotizados = new ArrayList<ItemCotizacion>();
		ItemCotizacion itemCotizado = new ItemCotizacion();
		
		System.out.println("afuera for");
		for(ListaDeRodamientos lista:listasDeRodamientos){
			System.out.println("adentro for");
			if(lista.isActual()){
				System.out.println("adentro if actual");
				boolean disponible =  lista.rodamientoDisponible(item.getRodamiento());
				if(disponible){
					System.out.println("adentro if disponible");
					int diferenciaStock = lista.obtenerStockDisponible(item.getRodamiento());
					if(diferenciaStock >= 0){
						System.out.println("adentro if stock > 0");
						float cotizacion = lista.cotizarRodamiento(item.getRodamiento(), item.getCantidad());
						itemCotizado.setCantidad(item.getCantidad());
						itemCotizado.setPrecioTotal(cotizacion);
						itemCotizado.setRodamiento(item.getRodamiento());
					}else{
						System.out.println("adentro else > 0");
						float cotizacion = lista.cotizarRodamiento(item.getRodamiento(), diferenciaStock*(-1));
						itemCotizado.setCantidad(diferenciaStock*(-1));
						itemCotizado.setPrecioTotal(cotizacion);
						itemCotizado.setRodamiento(item.getRodamiento());
					}
					itemsCotizados.add(itemCotizado);	
				}
			}
			
		}
		
		if(itemsCotizados.isEmpty()){
			return null;
		}else{
			return this.determinarMejorCotizacion(itemsCotizados, item.getCantidad());
		}
			
		
	}
	
	private ItemCotizacion determinarMejorCotizacion(List<ItemCotizacion> items, int cantidadPedidad){
		System.out.println("tama;o "+items.size());
		return this.mejorPrecioCotizado(items);
	}
	
	private ItemCotizacion mejorPrecioCotizado(List<ItemCotizacion> items){
		//System.out.println("tama;o "+items.size());
		double precio = items.get(0).getPrecioTotal();
		ItemCotizacion mejor = items.get(0);
		
		for(ItemCotizacion aux:items){
			if(aux.getPrecioTotal() < precio){
				precio = aux.getPrecioTotal();
				mejor = aux;
			}
		}
		return mejor;
	}
	
	
	public Rodamiento obtenerRodamientoReemplazo(ItemSolicitudCotizacion item){
		for(Rodamiento rod: rodamientosValidos){
			if(item.getRodamiento().getNroSerie()==rod.getNroSerie() && item.getRodamiento().getSubfijo()!=rod.getSubfijo()){
				return rod;
			}
		}
		return null;
	}
	
	private void cargarRodamientosValidos(){
		for(ListaDeRodamientos lista:listasDeRodamientos)
			for(Rodamiento rod: lista.obtenerTodosLosRodamientos())
				rodamientosValidos.add(rod);
	}
	
	public Calendar vencimientoMasCercanoLista(){
		Calendar c = listasDeRodamientos.get(0).getFechaHasta();
		for(ListaDeRodamientos lista: listasDeRodamientos)
			if(lista.getFechaHasta().before(c))
				c = lista.getFechaHasta();
		return c;
	}
	
	//getters y setters
	public List<Rodamiento> getRodamientosValidos() {
		return rodamientosValidos;
	}

	public void setRodamientosValidos(List<Rodamiento> rodamientosValidos) {
		this.rodamientosValidos = rodamientosValidos;
	}

	public List<ListaDeRodamientos> getListasDeRodamientos() {
		return listasDeRodamientos;
	}
	
	public void setListasDeRodamientos(List<ListaDeRodamientos> listasDeRodamientos) {
		this.listasDeRodamientos = listasDeRodamientos;
	}
}
